package org.yi.fc.entity;

import java.util.Date;
import java.util.List;

import org.yi.fc.utils.NumberUtils;
import org.yi.fc.utils.StringUtils;

import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.jfinal.log.Log4jLogger;
import com.jfinal.log.Logger;
import com.jfinal.plugin.activerecord.Model;

public class FColumn extends Model<FColumn>{

	private static final long serialVersionUID = 3366166958697051523L;
	
	public final static Logger logger = Log4jLogger.getLogger(FColumn.class);
	
	/** 栏目默认的起始栏目编号 */
	private final static String COLUMN_NO_BEGIN = "00";
	
	public static FColumn dao = new FColumn();
	
	/**
	 * 根据id获取栏目对象
	 * @param id
	 * @return
	 */
	public FColumn getColumnById(Object id){
		Preconditions.checkNotNull(id,"获取栏目对象时ID不能为空");
		return this.findById(id);
	}
	
	/**
	 * 根据栏目编号获取栏目
	 * @param code
	 * @return
	 */
	public List<FColumn> getColumnByCode(String code){
		Preconditions.checkNotNull(code,"获取栏目对象时栏目编号不能为空");
		return this.find("select * from f_column where column_no = ?",code);
	}
	
	/**
	 * 根据名称获取栏目
	 * @param name		中文名称（或者英文名称）
	 * @param isCN      第一个参数name是否为中文名称
	 * @return
	 */
	public FColumn getColumnByName(String name, boolean isCN){
		StringBuffer sb = new StringBuffer();
		sb.append("select * from f_column where 1=1 ");
		
		if(isCN){
			sb.append(" and column_name_cn = ? ");
		}else{
			sb.append(" and column_name_en = ? ");
		}
		
		List<FColumn> list = find(sb.toString(),name);
		
		if(list.size() > 1){
			logger.error("错误:根据栏目名称【" + name +  "】获取到多个栏目" );
			return null;
		}else{
			return list.get(0);
		}
	}
	
	/**
	 * 获取最顶级的栏目节点
	 * @return
	 */
	public List<FColumn> getTopNodeColumn(){
		final String sql = "select * from f_column where column_belongto is null or column_belongto = ''";
		return find(sql);
	}
	
	
	/**
	 * 根据父栏目ID获取所有的子栏目（但不包括该父栏目本身）
	 * @param id
	 * @return
	 */
	public List<FColumn> getAllChildrenFColumnsByParentId(Object id){
		Preconditions.checkNotNull(id,"获取栏目对象时ID不能为空");
		String columnNo = findById(id).getStr("column_no");
		return getAllChildrenFColumnsByParentCode(columnNo,false);
	}
	
	/**
	 * 根据父栏目节点的编号获取所有的子栏目
	 * @param code					父栏目编号
	 * @param isContainsParent 		查询后的栏目列表中是否包含父栏目本身
	 * @return
	 */
	public List<FColumn> getAllChildrenFColumnsByParentCode(String code,boolean isContainsParent){
		Preconditions.checkNotNull(Strings.isNullOrEmpty(code),"获取栏目对象时ID不能为空");
		StringBuffer sb = new StringBuffer("select * from f_column where 1=1 ");
		sb.append(" and column_no like '" + code  + "%' ");
		
		if(!isContainsParent){
			sb.append(" and column_no <> '")
			.append(code).append("'");
		}
		
		sb.append("  order by column_no asc");
		return find(sb.toString());
	}
	
	/**
	 * 根据父栏目节点的编号获取所有的子栏目（包括该父栏目本身）
	 * @param code
	 * @return
	 */
	public List<FColumn> getAllFColumnsByParentCode(String code){
		return getAllChildrenFColumnsByParentCode(code,true);
	}
	
	/**
	 * 根据父栏目ID获取下一级的子栏目（但不包括该父栏目本身）
	 * @param id
	 * @return
	 */
	public List<FColumn> getNextLevelChildrenFColumnsByParentId(Object id){
		Preconditions.checkNotNull(id,"获取栏目对象时ID不能为空");
		String columnNo = findById(id).getStr("column_no");
		return getNextLevelChildrenFColumnsByParentCode(columnNo);
	}
	
	/**
	 *  根据父栏目节点的编号获取下一级的子栏目（不包括该父栏目本身）
	 * @param code
	 * @return
	 */
	public List<FColumn> getNextLevelChildrenFColumnsByParentCode(String code){
		Preconditions.checkNotNull(Strings.isNullOrEmpty(code),"获取栏目对象时ID不能为空");
		String sql = "select * from f_column where column_no like '" + code  + "__' order by column_no asc";
		return find(sql);
	}
	
	
	/**
	 * 根据父栏目节点的编号获取所有的下级子栏目（包括该父栏目本身）
	 * @param code
	 * @return
	 */
	public List<FColumn> getAllNextLevelFColumnsByParentCode(String code){
		List<FColumn> list = getColumnByCode(code);
		list.addAll(getNextLevelChildrenFColumnsByParentCode(code));
		return list;
	}
	
	/**
	 * 获取父栏目下的最大的子栏目编号
	 * @param parentColumnNo		父栏目的编号
	 * @return
	 */
	private String getMaxColumnNo(String parentColumnNo){
		
		StringBuffer sb = new StringBuffer("select MAX(column_no) as column_no from f_column  ");
		
		if(Strings.isNullOrEmpty(parentColumnNo)){//当前栏目级别的编号为空时，即该栏目还未建立（为顶级栏目）
			sb.append(" where  column_belongto is NULL OR column_belongto = ''");
		}else{
			if(!NumberUtils.isNumber(parentColumnNo)){
				throw new NumberFormatException("栏目编号【" + parentColumnNo + "】不是数字");
			}
			sb.append(" where column_no like '")
			.append(parentColumnNo).append("__'")
			.append(" order by column_no desc");
		}
		
		FColumn column = findFirst(sb.toString());
		
		if(column != null){
			return column.getStr("column_no") == null ? parentColumnNo + COLUMN_NO_BEGIN : column.getStr("column_no");
		}else{
			return COLUMN_NO_BEGIN;  //如果没有找到子栏目，则栏目编号为起始编号
		}
	}

	/**
	 * 保存栏目
	 * @return
	 */
	public void saveColumn(String userName){
		String parentColumnNo = getStr("column_no");
		String maxCurColumnNo = getMaxColumnNo(parentColumnNo);
		String nextColumnNo = getNextColumnNo(maxCurColumnNo);
		
		this.set("column_no", nextColumnNo)
		.set("column_belongto", parentColumnNo)
		.set("column_create_time", new Date())
		.set("column_create_user", userName)
		.save()
		;
		
	}
	
	/**
	 * 根据上一个栏目编号获得新的栏目编号
	 * @param prevNo			上一个栏目编号
	 * @return 					新的栏目编号
	 */
	private final String getNextColumnNo(String prevNo){
		 Preconditions.checkNotNull(Strings.isNullOrEmpty(prevNo), "获取新的栏目编号时，传入的上一个栏目编号不能为空！");
		 int n = prevNo.length();
		 Integer prevNoValue = Integer.parseInt(prevNo);
		 Integer nextNoValue = prevNoValue + 1;
		 
		 String nextNoStr = String.valueOf(nextNoValue);
		 
		 return StringUtils.addZeroBeforeStr(nextNoStr, n - nextNoStr.length());
	}
	
}
